#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project ：图灵学习 
@File    ：6.await关键字.py
@IDE     ：PyCharm 
@Author  ：ChenLiGao
@Date    ：2024-11-07 10:43
'''
import asyncio

"""
    await后面跟的是一个可等待的对象，作用是等待后面的函数返回结果后，程序才会继续往下执行
    
    可等待对象：
        1.协程对象
        2.future对象
        3.task对象
    
    await会造成主线程堵塞，只有执行的任务返回结果了才解开堵塞
    
    一个协程任务的内部去运行（调用）另外一个协程任务，则需要通过await关键字去运行
    
    
    await关键字：
        1.必须在一个协程函数内部使用
        2.await关键字只能去调度课等待的任务：写成对象、task对象、future对象
        3.await调度任务后必须等待任务完成才能释放主线程
        4.await可以获取调度任务的返回值
            res = await work1()
            
            
    协程只能在主线程中创建
        因为事件循环
            可能有多个
"""

async def work1():
    print("这是一个异步任务：work1.........")
    await asyncio.sleep(3)
    return "任务1完成了"

async def work2():
    print("这是一个异步任务2开始：work2.........")
    res = await work1() # 一个协程任务的内部去运行（调用）另外一个协程任务，则需要通过await关键字去运行
    print(f"work1的结果：{res}")
    """
        work1存在演示，则导致任务2中的print要等待3秒后才会输出，所以await会导致主线程阻塞
    """
    print("这是一个异步任务2完成：work2.........")
    return "任务2完成了"

loop = asyncio.new_event_loop()
res = loop.run_until_complete(work2()) # 可以获取到一个任务的返回值
print(res)